/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Copyright(c) 2020 - 2023 Allwinner Technology Co.,Ltd. All rights reserved. */
/*
 * Allwinner SoCs display driver.
 *
 * Copyright (C) 2016 Allwinner.
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2.  This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */
#ifndef __DE_RTMX_TYPE_H__
#define __DE_RTMX_TYPE_H__

/* /////////////////////for global control/////////////////////// */
typedef union {
	unsigned int dwval;
	struct {
		unsigned int rt_en:1;	/* bit0 */
		unsigned int r0:3;	/* bit1~3 */
		unsigned int finish_irq_en:1;	/* bit4 */
		unsigned int error_irq_en:1;	/* bit5 */
		unsigned int r1:2;	/* bit6~7 */
		unsigned int sync_rev:1;	/* bit8 */
		unsigned int flied_rev:1;	/* bit9 */
		unsigned int r2:2;	/* bit10~11 */
		unsigned int rtwb_port:2;	/* bit12~13 */
		unsigned int r3:18;	/* bit14~31 */
	} bits;
} __glb_ctl_reg_t;		/* 0x0 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int finish_irq:1;	/* bit0 */
		unsigned int error_irq:1;	/* bit1 */
		unsigned int r0:2;	/* bit2~3 */
		unsigned int busy_status:1;	/* bit4 */
		unsigned int error_status:1;	/* bit5 */
		unsigned int r1:2;	/* bit6~7 */
		unsigned int even_odd_flag:1;	/* bit8 */
		unsigned int r2:23;	/* bit9~31 */
	} bits;
} __glb_status_reg_t;		/* 0x4 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int dbuff_rdy:1;	/* bit0 */
		unsigned int r0:31;	/* bit1~31 */
	} bits;
} __glb_dbuff_reg_t;		/* 0x8 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int width:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int height:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __glb_size_reg_t;		/* 0xc */

typedef struct {
	__glb_ctl_reg_t glb_ctl;	/* 0x00 */
	__glb_status_reg_t glb_status;	/* 0x04 */
	__glb_dbuff_reg_t glb_dbuff;	/* 0x08 */
	__glb_size_reg_t glb_size;	/* 0x0c */
} __glb_reg_t;

/* /////////////////////for video overlay/////////////////////// */
typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_en:1;	/* bit0 */
		unsigned int r0:3;	/* bit1~3 */
		unsigned int lay_fcolor_en:1;	/* bit4 */
		unsigned int r1:3;	/* bit5~7 */
		unsigned int lay_fmt:5;	/* bit8~12 */
		unsigned int r2:2;	/* bit13~14 */
		unsigned int ui_sel:1;	/* bit15 */
		unsigned int r3:7;	/* bit16~22 */
		unsigned int lay_top_down:1;	/* bit23 */
		unsigned int r4:8;	/* bit24~31 */
	} bits;
} __vi_lay_attr_reg_t;		/* 0x0+N*0x30(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_width:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int lay_height:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __vi_lay_size_reg_t;		/* 0x4+N*0x30(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_coorx:16;	/* bit0~15 */
		unsigned int lay_coory:16;	/* bit16~31 */
	} bits;
} __vi_lay_coor_reg_t;		/* 0x8+N*0x30(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_pitch:32;	/* bit0~31 */
	} bits;
} __vi_lay_pitch_reg_t;		/* 0xc/0x010/0x014+N*0x30(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_top_laddr:32;	/* bit0~31 */
	} bits;
} __vi_lay_top_laddr_reg_t;	/* 0x018/0x01c/0x020+N*0x30(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_bot_laddr:32;	/* bit0~31 */
	} bits;
} __vi_lay_bot_laddr_reg_t;	/* 0x024/0x028/0x02c+N*0x30(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_vb:8;	/* bit0~7 */
		unsigned int lay_ug:8;	/* bit8~15 */
		unsigned int lay_yr:8;	/* bit16~23 */
		unsigned int r0:8;	/* bit24~31 */
	} bits;
} __vi_lay_fcolor_reg_t;	/* 0x0c0+N*0x4(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay0_top_haddr:8;	/* bit0~7 */
		unsigned int lay1_top_haddr:8;	/* bit8~15 */
		unsigned int lay2_top_haddr:8;	/* bit16~23 */
		unsigned int lay3_top_haddr:8;	/* bit24~31 */
	} bits;
} __vi_lay_top_haddr_reg_t;	/* 0xd0~0x0xd8 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay0_bot_haddr:8;	/* bit0~7 */
		unsigned int lay1_bot_haddr:8;	/* bit8~15 */
		unsigned int lay2_bot_haddr:8;	/* bit16~23 */
		unsigned int lay3_bot_haddr:8;	/* bit24~31 */
	} bits;
} __vi_lay_bot_haddr_reg_t;	/* 0xdc~0xe4 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int ovl_width:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int ovl_height:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __vi_ovl_size_reg_t;		/* 0xe8~0xec */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int m:14;	/* bit0~13 */
		unsigned int r0:2;	/* bit14~15 */
		unsigned int n:14;	/* bit16~29 */
		unsigned int r1:2;	/* bit30~31 */
	} bits;
} __vi_hori_ds_reg_t;		/* 0xf0~0xf4 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int m:14;	/* bit0~13 */
		unsigned int r0:2;	/* bit14~15 */
		unsigned int n:14;	/* bit16~29 */
		unsigned int r1:2;	/* bit30~31 */
	} bits;
} __vi_vert_ds_reg_t;		/* 0xf8~0xfc */

typedef struct {
	__vi_lay_attr_reg_t lay_attr;	/* 0x00 */
	__vi_lay_size_reg_t lay_size;	/* 0x04 */
	__vi_lay_coor_reg_t lay_coor;	/* 0x08 */
	__vi_lay_pitch_reg_t lay_pitch[3];	/* 0x0c~0x14 */
	__vi_lay_top_laddr_reg_t lay_top_laddr[3];	/* 0x18~0x20 */
	__vi_lay_bot_laddr_reg_t lay_bot_laddr[3];	/* 0x24~0x2c */
} __vi_lay_reg_t;

typedef struct {
	__vi_lay_reg_t vi_lay_cfg[4];	/* 0x00~0x2c,0x30~0x5c,0x60~0x8c,0x90~0xbc, */
	__vi_lay_fcolor_reg_t vi_lay_fcolor[4];	/* 0xc0~0xcc */
	__vi_lay_top_haddr_reg_t vi_lay_top_haddr[3];	/* 0xd0~0xd8 */
	__vi_lay_bot_haddr_reg_t vi_lay_bot_haddr[3];	/* 0xdc~0xe4 */
	__vi_ovl_size_reg_t vi_ovl_size[2];	/* 0xe8~0xec */
	__vi_hori_ds_reg_t vi_hori_ds[2];	/* 0xf0~0xf4 */
	__vi_vert_ds_reg_t vi_vert_ds[2];	/* 0xf8~0xfc */
} __vi_ovl_reg_t;

/* /////////////////////for ui overlay/////////////////////// */
typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_en:1;	/* bit0 */
		unsigned int lay_alpmod:2;	/* bit1~2 */
		unsigned int r0:1;	/* bit3 */
		unsigned int lay_fcolor_en:1;	/* bit4 */
		unsigned int r1:3;	/* bit5~7 */
		unsigned int lay_fmt:5;	/* bit8~12 */
		unsigned int r2:3;	/* bit13~15 */
		unsigned int lay_alpctl:2;	/* bit16~17 */
		unsigned int r3:5;	/* bit18~22 */
		unsigned int lay_top_down:1;	/* bit23 */
		unsigned int lay_alpha:8;	/* bit24~31 */
	} bits;
} __ui_lay_attr_reg_t;		/* 0x0+N*0x20(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_width:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int lay_height:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __ui_lay_size_reg_t;		/* 0x4+N*0x20(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_coorx:16;	/* bit0~15 */
		unsigned int lay_coory:16;	/* bit16~31 */
	} bits;
} __ui_lay_coor_reg_t;		/* 0x8+N*0x20(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_pitch:32;	/* bit0~31 */
	} bits;
} __ui_lay_pitch_reg_t;		/* 0xc+N*0x20(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_top_laddr:32;	/* bit0~31 */
	} bits;
} __ui_lay_top_laddr_reg_t;	/* 0x10+N*0x20(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_bot_laddr:32;	/* bit0~31 */
	} bits;
} __ui_lay_bot_laddr_reg_t;	/* 0x14+N*0x20(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay_blue:8;	/* bit0~7 */
		unsigned int lay_green:8;	/* bit8~15 */
		unsigned int lay_red:8;	/* bit16~23 */
		unsigned int lay_alpha:8;	/* bit24~31 */
	} bits;
} __ui_lay_fcolor_reg_t;	/* 0x18+N*0x20(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay0_top_haddr:8;	/* bit0~7 */
		unsigned int lay1_top_haddr:8;	/* bit8~15 */
		unsigned int lay2_top_haddr:8;	/* bit16~23 */
		unsigned int lay3_top_haddr:8;	/* bit24~31 */
	} bits;
} __ui_lay_top_haddr_reg_t;	/* 0x80 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int lay0_bot_haddr:8;	/* bit0~7 */
		unsigned int lay1_bot_haddr:8;	/* bit8~15 */
		unsigned int lay2_bot_haddr:8;	/* bit16~23 */
		unsigned int lay3_bot_haddr:8;	/* bit24~31 */
	} bits;
} __ui_lay_bot_haddr_reg_t;	/* 0x84 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int ovl_width:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int ovl_height:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __ui_ovl_size_reg_t;		/* 0x88 */

typedef struct {
	__ui_lay_attr_reg_t lay_attr;	/* 0x00 */
	__ui_lay_size_reg_t lay_size;	/* 0x04 */
	__ui_lay_coor_reg_t lay_coor;	/* 0x08 */
	__ui_lay_pitch_reg_t lay_pitch;	/* 0x0c */
	__ui_lay_top_laddr_reg_t lay_top_laddr;	/* 0x10 */
	__ui_lay_bot_laddr_reg_t lay_bot_laddr;	/* 0x14 */
	__ui_lay_fcolor_reg_t lay_fcolor;	/* 0x18 */
	unsigned int r0;	/* 0x1c */
} __ui_lay_reg_t;

typedef struct {
	__ui_lay_reg_t ui_lay_cfg[4];	/* 0x00~0x1c,0x20~0x3c,0x40~0x5c,0x60~0x7c, */
	__ui_lay_top_haddr_reg_t ui_lay_top_haddr;	/* 0x80 */
	__ui_lay_bot_haddr_reg_t ui_lay_bot_haddr;	/* 0x84 */
	__ui_ovl_size_reg_t ui_ovl_size;	/* 0x88 */
} __ui_ovl_reg_t;

/* /////////////////////for alpha blending/////////////////////// */
typedef union {
	unsigned int dwval;
	struct {
		unsigned int p0_fcolor_en:1;	/* bit0 */
		unsigned int p1_fcolor_en:1;	/* bit1 */
		unsigned int p2_fcolor_en:1;	/* bit2 */
		unsigned int p3_fcolor_en:1;	/* bit3 */
		unsigned int p4_fcolor_en:1;	/* bit4 */
		unsigned int r0:3;	/* bit5~7 */
		unsigned int p0_en:1;	/* bit8 */
		unsigned int p1_en:1;	/* bit9 */
		unsigned int p2_en:1;	/* bit10 */
		unsigned int p3_en:1;	/* bit11 */
		unsigned int p4_en:1;	/* bit12 */
		unsigned int r1:19;	/* bit13~31 */
	} bits;
} __bld_fcolor_ctl_reg_t;	/* 0x0 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int blue:8;	/* bit0~7 */
		unsigned int green:8;	/* bit8~15 */
		unsigned int red:8;	/* bit16~23 */
		unsigned int alpha:8;	/* bit24~31 */
	} bits;
} __bld_fcolor_reg_t;		/* 0x4+N*0x10(N=0,1,2,3,4) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int width:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int height:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __bld_isize_reg_t;		/* 0x8+N*0x10(N=0,1,2,3,4) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int coorx:16;	/* bit0~15 */
		unsigned int coory:13;	/* bit16~31 */
	} bits;
} __bld_offset_reg_t;		/* 0xc+N*0x10(N=0,1,2,3,4) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int ch0_routr_ctl:4;	/* bit0~3 */
		unsigned int ch1_routr_ctl:4;	/* bit4~7 */
		unsigned int ch2_routr_ctl:4;	/* bit8~11 */
		unsigned int ch3_routr_ctl:4;	/* bit12~15 */
		unsigned int ch4_routr_ctl:4;	/* bit16~19 */
		unsigned int r0:12;	/* bit20~31 */
	} bits;
} __bld_route_ctl_reg_t;	/* 0x80 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int p0_alpha_mode:1;	/* bit0 */
		unsigned int p1_alpha_mode:1;	/* bit1 */
		unsigned int p2_alpha_mode:1;	/* bit2 */
		unsigned int p3_alpha_mode:1;	/* bit3 */
		unsigned int p4_alpha_mode:1;	/* bit4 */
		unsigned int r0:27;	/* bit5~31 */
	} bits;
} __bld_premultiply_ctl_reg_t;	/* 0x84 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int blue:8;	/* bit0~7 */
		unsigned int green:8;	/* bit8~15 */
		unsigned int red:8;	/* bit16~23 */
		unsigned int alpha:8;	/* bit24~31 */
	} bits;
} __bld_bkcolor_reg_t;		/* //0x88 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int width:13;	/* bit0~12 */
		unsigned int r0:3;	/* bit13~15 */
		unsigned int height:13;	/* bit16~28 */
		unsigned int r1:3;	/* bit29~31 */
	} bits;
} __bld_output_size_reg_t;	/* 0x8c */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int pixel_fs:4;	/* bit0~3 */
		unsigned int r0:4;	/* bit4~7 */
		unsigned int pixel_fd:4;	/* bit8~11 */
		unsigned int r1:4;	/* bit12~15 */
		unsigned int alpha_fs:4;	/* bit16~19 */
		unsigned int r2:4;	/* bit20~23 */
		unsigned int alpha_fd:4;	/* bit24~27 */
		unsigned int r3:4;	/* bit28~31 */
	} bits;
} __bld_ctl_reg_t;		/* 0x90+N*0x4(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int key0_en:1;	/* bit0 */
		unsigned int key0_dir:2;	/* bit1~2 */
		unsigned int r0:1;	/* bit3 */
		unsigned int key1_en:1;	/* bit4 */
		unsigned int key1_dir:2;	/* bit5~6 */
		unsigned int r1:1;	/* bit7 */
		unsigned int key2_en:1;	/* bit8 */
		unsigned int key2_dir:2;	/* bit9~10 */
		unsigned int r2:1;	/* bit11 */
		unsigned int key3_en:1;	/* bit12 */
		unsigned int key3_dir:2;	/* bit13~14 */
		unsigned int r3:17;	/* bit15~31 */
	} bits;
} __bld_colorkey_ctl_reg_t;	/* 0xb0 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int key0_blue:1;	/* bit0 */
		unsigned int key0_green:1;	/* bit1 */
		unsigned int key0_red:1;	/* bit2 */
		unsigned int r0:5;	/* bit3~7 */
		unsigned int key1_blue:1;	/* bit8 */
		unsigned int key1_green:1;	/* bit9 */
		unsigned int key1_red:1;	/* bit10 */
		unsigned int r1:5;	/* bit11~15 */
		unsigned int key2_blue:1;	/* bit16 */
		unsigned int key2_green:1;	/* bit17 */
		unsigned int key2_red:1;	/* bit18 */
		unsigned int r2:5;	/* bit19~23 */
		unsigned int key3_blue:1;	/* bit24 */
		unsigned int key3_green:1;	/* bit25 */
		unsigned int key3_red:1;	/* bit26 */
		unsigned int r3:5;	/* bit27~31 */
	} bits;
} __bld_colorkey_cfg_reg_t;	/* 0xb4 */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int max_blue:8;	/* bit0~7 */
		unsigned int max_green:8;	/* bit8~15 */
		unsigned int max_red:8;	/* bit16~23 */
		unsigned int r0:8;	/* bit24~31 */
	} bits;
} __bld_colorkey_max_reg_t;	/* 0xc0+N*0x4(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int min_blue:8;	/* bit0~7 */
		unsigned int min_green:8;	/* bit8~15 */
		unsigned int min_red:8;	/* bit16~23 */
		unsigned int r0:8;	/* bit24~31 */
	} bits;
} __bld_colorkey_min_reg_t;	/* 0xe0+N*0x4(N=0,1,2,3) */

typedef union {
	unsigned int dwval;
	struct {
		unsigned int premultiply_en:1;	/* bit0 */
		unsigned int interlace_en:1;	/* bit1 */
		unsigned int r0:30;	/* bit2~31 */
	} bits;
} __bld_out_color_ctl_reg_t;	/* 0xfc */

typedef struct {
	__bld_fcolor_reg_t fcolor;	/* 0x04 */
	__bld_isize_reg_t insize;	/* 0x08 */
	__bld_offset_reg_t offset;	/* 0x0c */
	unsigned int r0;	/* 0x10 */
} __bld_pipe_reg_t;

typedef struct {
	__bld_fcolor_ctl_reg_t bld_fcolor_ctl;	/* 0x00 */
	__bld_pipe_reg_t bld_pipe_attr[5];	/* 0x04~0x10,0x14~0x20,0x24~0x30,0x34~0x40,0x44~0x50 */
	unsigned int r0[11];	/* 0x54~0x7c */
	__bld_route_ctl_reg_t bld_route_ctl;	/* 0x80 */
	__bld_premultiply_ctl_reg_t bld_premultiply_ctl;	/* 0x84 */
	__bld_bkcolor_reg_t bld_bkcolor;	/* 0x88 */
	__bld_output_size_reg_t bld_output_size;	/* 0x8c */
	__bld_ctl_reg_t bld_mode[4];	/* 0x90~0x9c */
	unsigned int r1[4];	/* 0xa0~0xac */
	__bld_colorkey_ctl_reg_t bld_ck_ctl;	/* 0xb0 */
	__bld_colorkey_cfg_reg_t bld_ck_cfg;	/* 0xb4 */
	unsigned int r2[2];	/* 0xb8~0xbc */
	__bld_colorkey_max_reg_t bld_ck_max[4];	/* 0xc0~0xcc */
	unsigned int r3[4];	/* 0xd0~0xdc */
	__bld_colorkey_min_reg_t bld_ck_min[4];	/* 0xe0~0xec */
	unsigned int r4[3];	/* 0xf0~0xf8 */
	__bld_out_color_ctl_reg_t bld_out_ctl;	/* 0xfc */
} __bld_reg_t;

typedef struct {
	__glb_reg_t *glb_ctl;	/* 0x00000 */
	__bld_reg_t *bld_ctl;	/* 0x01000 */
	__vi_ovl_reg_t *vi_ovl[VI_CHN_NUM];	/* 0x02000 */
	__ui_ovl_reg_t *ui_ovl[UI_CHN_NUM];	/* 0x03000~0x05000 */
} __rtmx_reg_t;

#endif
